import random
class Jugador_humano(object):
	def __init__(self):
		self.criaturas=[]

	def agregar_criatura(self,criatura):
		self.criaturas.append(criatura)
		
	def eliminar_criatura(self,criatura):
		self.criaturas.remove(criatura)
		
	def elegir_criatura(self):
		if len(self.criaturas)==0:
			return None
		else:
			print "Posee",len(self.criaturas),"criaturas\n"
			
			for criatura in range(len(self.criaturas)):
				print "Estado criatura",criatura+1,":\n"
				for atributo in self.criaturas[criatura].obtener_estado():
					print atributo,":",self.criaturas[criatura].obtener_estado()[atributo]
			
			elegida=raw_input("ingrese el numero de criatura que desea elegir:")
			while not int(elegida) in range(1,len(self.criaturas)+1):
				elegida=raw_input("Ingrese el numero correcto de criatura que desea elegir:")
			return self.criaturas[int(elegida)-1]	
		
	def elegir_accion(self,origen,destino):
		habilidad_utilizar=raw_input("ingrese la habilidad que desea utilizar:")
		dest=raw_input("Sobre cual criatura aplicara esta habilidad? propia/enemiga:")
		while dest!="propia" and dest!="enemiga":
			dest=raw_input("Sobre cual criatura aplicara esta habilidad? Ingrese un destino valido. propia/enemiga:")
		if dest=="propia":
			return habilidad_utilizar,origen
		elif dest=="enemiga":
			return habilidad_utilizar,destino
		
		
class IA_random(object):
	def __init__(self):
		self.criaturas=[]
	
	def agregar_criatura(self,criatura):
		self.criaturas.append(criatura)
	
	def eliminar_criatura(self,criatura):
		self.criaturas.remove(criatura)
	
	def elegir_criatura(self):
		if len(self.criaturas)==0:
			return None
		else:
			elegida=random.choice(self.criaturas)
			return elegida
			
	def elegir_accion(self,origen,destino):
		habilidades=origen.obtener_habilidades()
		
		habilidad_elegida=random.choice(habilidades.keys())
		
		aplicacion=random.choice((origen,destino))
		
		consecuencias_origen,consecuencias_destino=habilidades[habilidad_elegida].obtener_consecuencias(origen,destino)
		
		if consecuencias_destino["hp"]<0:
			aplicacion=destino
		
		return habilidad_elegida,aplicacion
			

class IA_intel(object):
	def __init__(self):
		self.criaturas=[]

	def agregar_criatura(self,criatura):
		self.criaturas.append(criatura)
		
	def eliminar_criatura(self,criatura):
		self.criaturas.remove(criatura)
		
	def elegir_criatura(self):
		if len(self.criaturas)==0:
			return None
		else:
			maxi=0
			cont=0
			mejor=self.criaturas[0]
			for atributo in self.criaturas[0].obtener_estado():
				maxi+=self.criaturas[0].obtener_estado()[atributo]
			
			for cria in self.criaturas:
				for atri in cria.obtener_estado():
					cont+=cria.obtener_estado()[atri]
					if cont>maxi:
						maxi=cont
						mejor=cria	
				cont=0
			return mejor	
			
	def decidir_actitud(self,estado_propio):
		cont_vida=0				
		for atributo in estado_propio.values():
			cont_vida+=atributo
		if cont_vida<10:					#si tiene poca vida la criatura, adopta una actitud defensiva, sino ataca 
			actitud="defender"
		elif cont_vida>10:
			actitud="atacar"
		return actitud	
			
	def descartar(self,habilidades_propias,estado_propio,posibles_hab_1):		
		for habilidad in habilidades_propias.values():
			for costo in habilidad.obtener_costos():
					if habilidad.obtener_costos()[costo]<estado_propio[costo]:	#elige posibles habilidades segun el estado de la criatura y el costo
						posibles_hab_1.append(habilidad)	
						
	def ataque(self,posibles_hab_1,origen,destino):
		max_danio=0
		conta=0								#si va a atacar, elige la accion que hace mas danio
		mas_pod=posibles_hab_1[0]
		
		ori,dest=posibles_hab_1[0].obtener_consecuencias(origen,destino)
		
		for atributo_ in dest:
			max_danio+=dest[atributo_]
			
		for habilidad_ in posibles_hab_1:
			o,d=habilidad_.obtener_consecuencias(origen,destino)		
			for atr in d:
				conta+=d[atr]
				if conta<max_danio:
					max_danio=conta
					mas_pod=habilidad_	
			conta=0
		return mas_pod

	def defensa(self,posibles_hab_1,origen,destino):	
		max_salud=0						#si se va a defender, elige la habilidad que mas aumente sus atributos
		count=0
		mas_saludable=posibles_hab_1[0]
		
		orig,desti=posibles_hab_1[0].obtener_consecuencias(origen,destino)
		
		for atrib_ in desti:
			max_salud+=desti[atrib_]
			
		for _habilidad in posibles_hab_1:
			orign,destin=_habilidad.obtener_consecuencias(origen,destino)
			for atr_ in destin:
				count+=destin[atr_]
				if count>max_salud:
					max_salud=count
					mas_saludable=_habilidad
			count=0
		return mas_saludable	

	

	def eleccion(self,habilidades_propias,estado_propio,origen,destino):
		posibles_hab_1=[]
		
	
		self.descartar(habilidades_propias,estado_propio,posibles_hab_1)
						
		actitud=self.decidir_actitud(estado_propio)
		
				
		result_ataque=self.ataque(posibles_hab_1,origen,destino)


		for nombre in habilidades_propias:
			if habilidades_propias[nombre]==result_ataque:
				elegida_at=nombre	

			
		result_defensa=self.defensa(posibles_hab_1,origen,destino)
		
		
		for nombre_ in habilidades_propias:
			if habilidades_propias[nombre_]==result_defensa:
				elegida_def=nombre_

		if actitud=="atacar":
			return elegida_at,destino
		
		elif actitud=="defender":
			return elegida_def,origen
			
	def elegir_accion(self,origen,destino):
		habilidades_propias=origen.obtener_habilidades()
		estado_propio=origen.obtener_estado()
		
		return self.eleccion(habilidades_propias,estado_propio,origen,destino)

class Criatura(object):
	def __init__(self):
		dado=[1,2,3,4,5,6]
		
		self.fuerza=random.choice(dado)+random.choice(dado)+random.choice(dado)
		self.contextura=random.choice(dado)+random.choice(dado)+random.choice(dado)
		self.sabiduria=random.choice(dado)+random.choice(dado)+random.choice(dado)
		self.carisma=random.choice(dado)+random.choice(dado)+random.choice(dado)
		self.destreza=random.choice(dado)+random.choice(dado)+random.choice(dado)
		self.inteligencia=random.choice(dado)+random.choice(dado)+random.choice(dado)
		
		self.mp=self.inteligencia+self.sabiduria
		self.hp=self.fuerza+self.contextura+self.sabiduria+self.carisma+self.destreza+self.inteligencia
		self.xp=0
		
		self.habilidades=[]	
		
		estado={"fuerza":self.fuerza,"contextura":self.contextura,"sabiduria":self.sabiduria,"carisma":self.carisma,"destreza":self.destreza,"inteligencia":self.inteligencia,"hp":self.hp,"mp":self.mp,"xp":self.xp}
		
		
		h1=Punietazo()
		h2=Regeneracion()
		h3=Atontamiento()			#todas las habilidades existentes 
		h4=Absorcion()
		h5=Puas()
		h6=Pensar()
		habbi=[h1,h2,h3,h4,h5,h6]
		
		no_sirven=[]
		
		for h_ in habbi:
			for atri_ in h_.obtener_costos():
				if h_.obtener_costos()[atri_]>estado[atri_]:
					no_sirven.append(h_)
		
		for n in no_sirven:
			if n in habbi:
				habbi.remove(n)
	
					
		while len(habbi)>0:
			ch=random.choice(habbi)
			self.habilidades.append(ch)		#elige un maximo de tres habilidades entre las posibles
			habbi.remove(ch)
			if len(self.habilidades)>2:
				break
		
	def obtener_habilidades(self):
		ha={}
		for habil in self.habilidades:
			ha[habil.nombre]=habil
		return ha

	def obtener_estado(self):
		est={}
		est["xp"]=self.xp
		est["mp"]=self.mp
		est["hp"]=self.hp
		est["fuerza"]=self.fuerza
		est["contextura"]=self.contextura
		est["sabiduria"]=self.sabiduria
		est["carisma"]=self.carisma
		est["destreza"]=self.destreza
		est["inteligencia"]=self.inteligencia
		
		return est
		
	def aplicar_consecuencias(self,consecuencias):
		
		self.xp+=consecuencias["xp"]
		if self.xp<0:
			self.xp=0
		self.mp+=consecuencias["mp"]
		if self.mp<0:
			self.xp=0
		self.hp+=consecuencias["hp"]
		if self.hp<0:
			self.hp=0
		self.fuerza+=consecuencias["fuerza"]
		if self.fuerza<0:
			self.fuerza=0
		self.contextura+=consecuencias["contextura"]
		if self.contextura<0:
			self.contextura=0
		self.sabiduria+=consecuencias["sabiduria"]
		if self.sabiduria<0:
			self.sabiduria=0
		self.carisma+=consecuencias["carisma"]
		if self.carisma<0:
			self.carisma=0
		self.destreza+=consecuencias["destreza"]
		if self.destreza<0:
			self.destreza=0
		self.inteligencia+=consecuencias["inteligencia"]
		if self.inteligencia<0:
			self.inteligencia=0
			
	def modificar_atributos(self,dicc):
		self.xp=dicc["xp"]
		self.mp=dicc["mp"]
		self.hp=dicc["hp"]
		self.fuerza=dicc["fuerza"]
		self.contextura=dicc["contextura"]
		self.sabiduria=dicc["sabiduria"]
		self.carisma=dicc["carisma"]
		self.destreza=dicc["destreza"]
		self.inteligencia=dicc["inteligencia"]
			
	def aumentar_experiencia(self):
		self.xp+=1
			
class Punietazo(object):
	def __init__(self):
		self.nombre="Punietazo"
		
	def __eq__(self,otra):
		if self.nombre==otra.nombre:
			return True
	
	def obtener_costos(self):
		costos={}
		costos["hp"]=0
		costos["xp"]=0
		costos["mp"]=0
		costos["fuerza"]=0
		costos["inteligencia"]=0
		costos["destreza"]=0
		costos["sabiduria"]=0
		costos["carisma"]=0
		costos["contextura"]=0
		
		return costos
		
	def obtener_consecuencias(self,origen,destino):
		cons_origen={}
		cons_destino={}
		
		cons_origen["hp"]=0
		cons_origen["xp"]=0
		cons_origen["mp"]=0
		cons_origen["fuerza"]=0
		cons_origen["inteligencia"]=0
		cons_origen["destreza"]=0
		cons_origen["sabiduria"]=0
		cons_origen["carisma"]=0
		cons_origen["contextura"]=0
		
		cons_destino["xp"]=0
		cons_destino["mp"]=0
		cons_destino["fuerza"]=0
		cons_destino["inteligencia"]=0
		cons_destino["destreza"]=0
		cons_destino["sabiduria"]=0
		cons_destino["carisma"]=0
		cons_destino["contextura"]=0
				
		
		if origen.obtener_estado()["contextura"]>=10:
			cons_destino["hp"]=-20
		else:
			cons_destino["hp"]=-10
			
		return cons_origen,cons_destino

class Regeneracion(object):
	def __init__(self):
		self.nombre="Regeneracion"
		
	def __eq__(self,otra):
		if self.nombre==otra.nombre:
			return True	
		
	def obtener_costos(self):
		costos={}
		costos["hp"]=0
		costos["xp"]=0
		costos["mp"]=5
		costos["fuerza"]=5
		costos["inteligencia"]=10
		costos["destreza"]=0
		costos["sabiduria"]=10
		costos["carisma"]=0
		costos["contextura"]=0
		
		return costos
		
	def obtener_consecuencias(self,origen,destino):
		
		cons_origen={}
		cons_destino={}
		
		
		cons_origen["hp"]=0
		cons_origen["mp"]=-5	
		cons_origen["xp"]=0
		cons_origen["fuerza"]=0
		cons_origen["inteligencia"]=0
		cons_origen["destreza"]=0
		cons_origen["sabiduria"]=0
		cons_origen["carisma"]=0
		cons_origen["contextura"]=0
		
		if origen.obtener_estado()["mp"]>15:
			cons_destino["hp"]=20
		else:
			cons_destino["hp"]=15
		cons_destino["xp"]=0
		cons_destino["mp"]=0
		cons_destino["fuerza"]=0
		cons_destino["inteligencia"]=0
		cons_destino["destreza"]=0
		cons_destino["sabiduria"]=0
		cons_destino["carisma"]=0
		cons_destino["contextura"]=0
		
		return cons_origen,cons_destino
		
class Atontamiento(object):
	def __init__(self):
		self.nombre="Atontamiento"
		
	def __eq__(self,otra):
		if self.nombre==otra.nombre:
			return True	
		
	def obtener_costos(self):
		costos={}
		costos["hp"]=0
		costos["xp"]=0
		costos["mp"]=10
		costos["fuerza"]=5
		costos["inteligencia"]=10
		costos["destreza"]=5
		costos["sabiduria"]=15
		costos["carisma"]=0
		costos["contextura"]=5
		
		return costos
		
	def obtener_consecuencias(self,origen,destino):
		cons_origen={}
		cons_destino={}
		
		cons_origen["hp"]=0
		cons_origen["xp"]=0
		cons_origen["mp"]=-10
		cons_origen["fuerza"]=0
		cons_origen["inteligencia"]=0
		cons_origen["destreza"]=0
		cons_origen["sabiduria"]=0
		cons_origen["carisma"]=0
		cons_origen["contextura"]=0
		
		
		if origen.obtener_estado()["xp"]>15:
			cons_destino["hp"]=-10
		else:
			cons_destino["hp"]=-5
		
		cons_destino["xp"]=0
		
		if origen.obtener_estado()["sabiduria"]>15:
			cons_destino["mp"]=-15
		else:
			cons_destino["mp"]=-5
			
		cons_destino["fuerza"]=-5
		cons_destino["inteligencia"]=-5
		cons_destino["destreza"]=0
		cons_destino["sabiduria"]=0
		cons_destino["carisma"]=0
		cons_destino["contextura"]=0
		
		return cons_origen,cons_destino
		
		
class Absorcion(object):	
	def	__init__(self):
		self.nombre="Absorcion"
		
	def __eq__(self,otra):
		if self.nombre==otra.nombre:
			return True	
	
	def obtener_costos(self):
		costos={}
		
		costos["hp"]=0
		costos["xp"]=15
		costos["mp"]=15
		costos["fuerza"]=10
		costos["inteligencia"]=15
		costos["destreza"]=0
		costos["sabiduria"]=10
		costos["carisma"]=10
		costos["contextura"]=0
		
		return costos
	
	def obtener_consecuencias(self,origen,destino):
		cons_origen={}
		cons_destino={}
		
		cons_origen["hp"]=10	
		cons_origen["xp"]=0
		cons_origen["mp"]=-15
		cons_origen["fuerza"]=10	
		cons_origen["inteligencia"]=5
		cons_origen["destreza"]=0
		cons_origen["sabiduria"]=10
		cons_origen["carisma"]=0
		cons_origen["contextura"]=0
		
		jmn
		
		if destino.obtener_estado()["contextura"]<10:
			cons_destino["hp"]=-20
		else:
			cons_destino["hp"]=-10
			
		cons_destino["xp"]=0
		cons_destino["mp"]=-10
		cons_destino["fuerza"]=-10
		cons_destino["inteligencia"]=-5
		cons_destino["destreza"]=0
		cons_destino["sabiduria"]=-10
		cons_destino["carisma"]=0
		cons_destino["contextura"]=0
	
		return cons_origen,cons_destino
		
class Puas(object):
	def __init__(self):
		self.nombre="Puas"
		
	def __eq__(self,otra):
		if self.nombre==otra.nombre:
			return True	
		
	def obtener_costos(self):
		costos={}
		
		costos["hp"]=0
		costos["xp"]=0
		costos["mp"]=0
		costos["fuerza"]=10
		costos["inteligencia"]=0
		costos["destreza"]=5
		costos["sabiduria"]=0
		costos["carisma"]=0
		costos["contextura"]=10
		
		return costos
	
	def obtener_consecuencias(self,origen,destino):
		cons_origen={}
		cons_destino={}
		
		cons_origen["hp"]=0
		cons_origen["xp"]=0
		cons_origen["mp"]=0
		cons_origen["fuerza"]=0
		cons_origen["inteligencia"]=0
		cons_origen["destreza"]=0
		cons_origen["sabiduria"]=0
		cons_origen["carisma"]=0
		cons_origen["contextura"]=0
		
		if destino.obtener_estado()["contextura"]<15:
			cons_destino["hp"]=-15
		else:
			cons_destino["hp"]=-5
			
		cons_destino["xp"]=0
		cons_destino["mp"]=0
		cons_destino["fuerza"]=-10
		cons_destino["inteligencia"]=0
		cons_destino["destreza"]=0
		cons_destino["sabiduria"]=0
		cons_destino["carisma"]=0
		cons_destino["contextura"]=0
		
		return cons_origen,cons_destino
		
class Pensar(object):
	def __init__(self):
		self.nombre="Pensar"
	
	def __eq__(self,otra):
		if self.nombre==otra.nombre:
			return True
		
	def obtener_costos(self):
		costos={}
		
		costos["hp"]=0
		costos["xp"]=10
		costos["mp"]=10
		costos["fuerza"]=0
		costos["inteligencia"]=15
		costos["destreza"]=0
		costos["sabiduria"]=15
		costos["carisma"]=0
		costos["contextura"]=0
		
		return costos
		
	def obtener_consecuencias(self,origen,destino):
		cons_origen={}
		cons_destino={}
		
		cons_origen["hp"]=0
		cons_origen["xp"]=0
		cons_origen["mp"]=-10
		cons_origen["fuerza"]=0
		cons_origen["inteligencia"]=0
		cons_origen["destreza"]=0
		cons_origen["sabiduria"]=0
		cons_origen["carisma"]=0
		cons_origen["contextura"]=0
		
		cons_destino["hp"]=10
		cons_destino["xp"]=0
		cons_destino["mp"]=0
		cons_destino["fuerza"]=10
		cons_destino["inteligencia"]=10
		cons_destino["destreza"]=0
		cons_destino["sabiduria"]=10
		cons_destino["carisma"]=0
		cons_destino["contextura"]=0
		
		return cons_origen,cons_destino
		